package estates.model;

import java.util.HashMap;

/*
 * Klasy nie trzeba mapować do bazy danych. Jest jedynie wykorzystywana
 * do wykonywania obliczeń.
 */
public class OcenyDekorator extends Dekorator {
	
  private int iloscOcen;
  private int sumaOcen;
  private HashMap<String, Integer> sumyOcen = new HashMap<String, Integer>();
  
  public OcenyDekorator() {
  }

  public OcenyDekorator(Estate e) {
    super(e);
  }

  @Override
  public void dekoruj(HashMap<String, Object> hm) {
    this.element.dekoruj(hm);
  }

  @Override
  public boolean equals(Object e) {
    if (!(e instanceof OcenyDekorator)) {
      return false;
    }
    return element.equals(e);
  }

  @Override
  public int hashCode() {
    int hash = 7;
    hash = 71 * hash + this.sumaOcen;
    hash = 71 * hash + this.iloscOcen;
    return hash;
  }

  @Override
  public String toString() {
      HashMap<String, String> hh = obliczSrednieOceny();
	StringBuilder sb = new StringBuilder(element.toString());
    sb.append("&iloscOcen=" + iloscOcen);
	sb.append("&estetyka=" + hh.get("estetyka"));
	sb.append("&komfort=" + hh.get("komfort"));
	sb.append("&lokalizacja=" + hh.get("lokalizacja"));
    return sb.toString();
  }

	@Override
	public HashMap<String, String> obliczSrednieOceny() {
		iloscOcen = 0;
		sumyOcen = new HashMap<String, Integer>();
		sumyOcen.put("estetyka", new Integer(0));
		sumyOcen.put("komfort", new Integer(0));
		sumyOcen.put("lokalizacja", new Integer(0));
		for (Comment komentarz : getComments())
		{
			sumyOcen.put("estetyka", sumyOcen.get("estetyka")+komentarz.getOcenaEstetyka());
			sumyOcen.put("komfort", sumyOcen.get("komfort")+komentarz.getOcenaKomfort());
			sumyOcen.put("lokalizacja", sumyOcen.get("lokalizacja")+komentarz.getOcenaLokalizacja());
			iloscOcen++;
		}
		HashMap<String, String> returnMap = new HashMap<String, String>();
        if(iloscOcen>0){
			returnMap.put("estetyka", Double.toString(((double)sumyOcen.get("estetyka").intValue())/((double)iloscOcen)));
			returnMap.put("komfort", Double.toString(((double)sumyOcen.get("komfort").intValue())/((double)iloscOcen)));
			returnMap.put("lokalizacja", Double.toString(((double)sumyOcen.get("lokalizacja").intValue())/((double)iloscOcen)));
        }
		else{
			returnMap.put("estetyka", "Brak ocen");
			returnMap.put("komfort", "Brak ocen");
			returnMap.put("lokalizacja", "Brak ocen");
        }
        return returnMap;
	}
}
